/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_ee.h
 * @brief 定义EE模块相关接口
 */

#ifndef _NFA_EE_H_
#define _NFA_EE_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nci_feature.h"
#include "nfa_base.h"
#include "nfa_utils.h"

#if IS_FEATURE_ON(NCI_FEATURE_EE)

#define EE_NAME_ESE1 "eSE1"
#define EE_NAME_ESE2 "eSE2"
#define EE_NAME_SIM1 "SIM1"
#define EE_NAME_SIM2 "SIM2"

#define NCI_MAX_NFCEE_SUPPORT (4) /* ESE, SIM1, SIM2, NDEF */

typedef enum {
    NCI_NFCEE_PROTOCOL_APDU = 0x00,
    NCI_NFCEE_PROTOCOL_T3T = 0x02,
    NCI_NFCEE_PROTOCOL_TRANSPARENT = 0x03,
} tNCI_EE_PROTOCOLS;

typedef enum {
    NCI_NFCEE_ESE1 = 0x00,
    NCI_NFCEE_SIM1 = 0x01,
    NCI_NFCEE_SIM2 = 0x02,
} tNCI_EE_TYPE;

/**
 * @brief 设置EE的power and link control
 *
 * @param enable 设置开启、关闭
 */
void nfa_ee_set_power_and_link_ctrl(bool enable);

/**
 * @brief 获取处于激活状态的EE
 *
 * @param[out] buff 用于接受nfcee列表的内存区域
 * @param[out] len 返回的列表的大小
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_ee_get_active_nfcee_list(uint8_t* buff, uint8_t* len);

/**
 * @brief 获取EE的实际名称
 *
 * @param[in] ee 传入的EE的id
 *
 * @return 成功返回EE对应的名称，失败返回NULL
 */
const char* nfa_ee_get_nfcee_name(uint8_t ee);

/**
 * @brief 获取EE的实际id
 *
 * @param[in] type 传入的EE的类型
 *
 * @return 成功返回EE对应的id，失败返回无效值FF
 */
uint8_t nfa_ee_get_nfcee_id(tNCI_EE_TYPE type);

#if IS_FEATURE_ON(NCI_FEATURE_ROUTING)
/**
 * @brief 获取路由表容量大小
 *
 * @return 返回路由表容量大小
 */
uint16_t nfa_ee_get_lmrt_max_size();
/**
 * @brief 获取路由表中预留给Aid路由部分的大小
 *
 * @return 返回对应错误码路由表中预留给Aid路由部分的大小
 */
uint16_t nfa_ee_get_aid_table_size();
/**
 * @brief 获取当前路由表
 *
 * @param buff 传入用于获取路由表的buffer
 * @param len 传入用于获取路由表的buffer的大小, 成功时修改为路由表的准确大小
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_ee_get_lmrt(uint8_t* buff, uint16_t *len);
#endif // IS_FEATURE_ON(NCI_FEATURE_ROUTING)

/**
 * @brief 获取EE的数据通道号
 *
 * @param[in] ee_id 传入的EE的ID
 *
 * @return 成功返回对应EE的数据通道号，否则返回0
 */
uint8_t nfa_ee_get_channel_id(uint8_t ee_id);
/**
 * @brief 打开与选中的EE之间的数据通道
 *
 * @param[in] ee_id 传入的EE的ID
 * @param[in] interface 打开通道的目标接口协议类型
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_ee_open_channel(uint8_t ee_id, tNCI_EE_PROTOCOLS interface);
/**
 * @brief 关闭与选中的EE之间的数据通道
 *
 * @param[in] ee_id 传入的EE的ID
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_ee_close_channel(uint8_t ee_id);

#if IS_FEATURE_ON(NCI_FEATURE_EE_T4T)
/**
 * @brief 向T4T Ndef NFCEE中读取NDEF数据
 *
 * @param[in] file_id 操作的目标文件ID
 * @param[inout] buffer 接收返回的NDEF数据
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_t4tee_read(uint16_t file_id, tNCI_RSP* buffer);
/**
 * @brief 向T4T Ndef NFCEE中写入NDEF数据
 *
 * @param[in] file_id 操作的目标文件ID
 * @param[in] data 传入的数据的指针
 * @param[in] len 传入的数据的长度
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_t4tee_write(uint16_t file_id, uint8_t* data, uint32_t len);
/**
 * @brief 向T4T Ndef NFCEE发送APDU指令，并获取回复
 *
 * @param[in]    cmd 传入的APDU指令数据指针
 * @param[in]    len 传入的指令的长度
 * @param[inout] rsp 储存APDU指令的回复
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_t4tee_send_apdu(uint8_t* cmd, uint32_t len, tNCI_RSP* rsp);
/**
 * @brief 获取T4T Ndef NFCEE默认的路由电源状态
 *
 * @return 返回T4T Ndef NFCEE默认的路由电源状态
 */
uint8_t nfa_t4tee_get_power_state();
#endif // IS_FEATURE_ON(NCI_FEATURE_EE_T4T)
#endif // IS_FEATURE_ON(NCI_FEATURE_EE)

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _NFA_EE_H_ */